package com.baitiaojun.common.utils.sql;

import com.baitiaojun.common.enums.impl.ServerExpEnums;
import com.baitiaojun.common.exception.ServerException;
import org.apache.commons.lang3.StringUtils;

/**
 * 防sql注入工具类, 通过正则和关键字校验
 */
public class SqlUtils {

    /**
     * 定义常用的 sql关键字
     */
    public static String SQL_REGEX = "select |insert |delete |update |drop |count |exec |chr |mid |master |truncate |char |and |declare ";

    /**
     * 仅支持字母、数字、下划线、空格、逗号、小数点（支持多个字段排序）
     */
    public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";

    /**
     * sql参数校验
     * @param column
     * @return
     */
    public static void isLegalParam(String column) {
        if (StringUtils.isBlank(column) || !verifyColumn(column)) {
            throw new ServerException(ServerExpEnums.EXP_SQL_ILLEGAL_PARAM);
        }
    }

    public static boolean verifyColumn(String column) {
        return column.matches(SQL_PATTERN);
    }

    public static void isLegalKeyWord(String keyWord) {
        if (StringUtils.isBlank(keyWord)) {
            throw new ServerException(ServerExpEnums.EXP_SQL_ILLEGAL_KEYWORD);
        }
        String[] sqlRegex = SQL_REGEX.split("\\|");
        for (String regex : sqlRegex) {
            if (!keyWord.equalsIgnoreCase(regex)) {
                throw new ServerException(ServerExpEnums.EXP_SQL_ILLEGAL_KEYWORD);
            }
        }
    }
}
